/* Copyright © 2010 LPRM
Universidade Federal do Espírito Santo - RNP-GT CWTools

This file is part of GW-Android.

GW-Android is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

GW-Android is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with GW-Android. If not, see <http://www.gnu.org/licenses/>. */
package br.ufes.cwtools.gw.android.components;

import java.util.ArrayList;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.util.Log;

public class ComponentLifecycleHelper {
	public static String LOG_TAG = "ComponentLifecycleHelper";
	
	public static final int RESULT_BACK = Activity.RESULT_FIRST_USER;
	public static final String EXTRA_RELATED_COMPONENTS = "br.ufes.cwtools.android.Component.EXTRA_RELATED_COMPONENTS";
	public static final String EXTRA_SELECTED_COMPONENT_TAG = "br.ufes.cwtools.android.Component.EXTRA_SELECTED_COMPONENT_TAG";
	public static final String RELATED_EXTRA_DEFAULT = "default";  // TODO melhorar
	
	/**
	 * Determina o component a ser executado em seguida e coloca o extra correspondente
	 * no intent desta activity. Se necessário será exibido um diálogo para que o usuário
	 * escolha qual componente deseja utilizar.
	 * 
	 * @param relatedExtra especifica qual conjunto de related components utilizar.
	 * Se este parâmetro for null serão utilizados os related components especificados como padrão.
	 * @param finishAfterwards indica se este component será finalizado em seguida.
	 * @param isCancelable indica se é permitido ao usuário cancelar o diálogo.
	 */
	public static void selectNextComponent(final Activity component, String relatedExtra, final boolean finishAfterwards, boolean isCancelable) {
		
		final ArrayList<RelatedComponent> allRelatedComponents = component.getIntent().getParcelableArrayListExtra(EXTRA_RELATED_COMPONENTS);
		Log.d(LOG_TAG, allRelatedComponents.size() + " related components no total.");
		
		if (relatedExtra == null) relatedExtra = RELATED_EXTRA_DEFAULT;
		final ArrayList<RelatedComponent> relatedComponents = RelatedComponent.filterRelatedComponents(allRelatedComponents, relatedExtra);
		final int size = relatedComponents.size();
		
//		String tag = null;
		
		if (size == 0) {  // Nenhum componente relacionado que utilize o extra especificado.
			Log.d(LOG_TAG, "Não foi encontrado um componente que utilize o extra \"" + relatedExtra + "\"");
			if (finishAfterwards) {
				component.getIntent().putExtra(EXTRA_SELECTED_COMPONENT_TAG, "");
				component.finish();
			}
			
		} else if (size == 1) {  // Apenas um componente utiliza o extra especificado, utilizará este componente.
			Log.d(LOG_TAG, "Apenas um componente utiliza o extra \"" + relatedExtra + "\"; iniciaremos este componente.");
			setNextComponentTag(component, relatedComponents.get(0).getTag(), finishAfterwards);
			
		} else {  // Mais de um componente utiliza o extra especificado, exibirá um menu para que um componente seja escolhido pelo usuário.
			Log.d(LOG_TAG, size + " related components utilizam o extra \"" + relatedExtra + "\".");

			final AlertDialog.Builder builder = new AlertDialog.Builder(component);
			builder.setCancelable(isCancelable);  // TODO Testar isso com a mudança de orientação.
//			builder.setTitle("");
			
			final ArrayList<String> itemsList = new ArrayList<String>();
			for (RelatedComponent relatedComponent : relatedComponents) {
				itemsList.add(relatedComponent.getLabel());
			}
			final String[] items = new String[itemsList.size()];
			itemsList.toArray(items);
			
			builder.setItems(items, new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
					setNextComponentTag(component, relatedComponents.get(which).getTag(), finishAfterwards);
				}
			});
			builder.create().show();
		}
	}
	
	private static void setNextComponentTag(Activity component, String tag, boolean finishAfterwards) {
		component.getIntent().putExtra(EXTRA_SELECTED_COMPONENT_TAG, tag);
		if (finishAfterwards) {
			component.setResult(Activity.RESULT_OK, component.getIntent());
			component.finish();
		}
	}
}
